// 数组 增删非首尾元素时往往需要移动元素
// 链表的话  只要移动下next指针就行了
// 
// leetcode 237 删除链表中的节点
function listNode(val) {
  this.val = val
  this.next = null
}
let head = new listNode(1)
var deleteNode = function(node) {
  // let now = head
  // if(now.val == node.val) {
  //   // ..
  // }
  // while(now.next) {
  //   if(head.next.val == node.val) {
  //     now.next = now.next.next
  //     return
  //   }else{
  //     now = head.next
  //   }
  // }
  // 把要删除的这个节点 赋值成他的下个节点  相当于现在就是变成了 下个节点了
  // 然后他原先的 下个节点变成 下下个节点
  node.val = node.next.val
  node.next = node.next.next
}


// LeetCode 206  反转链表
// 双指针遍历反转
// 这道题啊 思路要清晰
// 1 声明两个变量 p1 p2 
// p1最新的值 把他的next 指向p2  
// p1赋值给p2  p2作为新的一条链子
// p1 作为遍历  p1为剩余的链子
function reverseList(head) {
  let p1 = head
  let p2 = null
  while(p1) {
    let temp = p1.next 
    p1.next = p2
    p2 = p1
    p1 = temp
  }
  return p2
}

// leetcode 2 
/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var addTwoNumbers = function(l1, l2) {
  const l3 = new ListNode(0)
  let p1 = l1
  let p2 = l2
  let p3 = l3
  let carry = 0
  while(p1 || p2) {
      const v1 = p1 ? p1.val : 0
      const v2 = p2 ? p2.val : 0
      const val = v1 + v2 + carry
      carry = Math.floor(val / 10)
      p3.next = new ListNode( val % 10)
      if(p1) p1 = p1.next
      if(p2) p2 = p2.next
      p3 = p3.next
  }
  if(carry>0) p3.next = new ListNode(carry)
  return l3.next;
};

// LeetCode 83 
// 给定一个排序链表，删除所有重复的元素，使得每个元素只出现一次。
var deleteDuplicates = function(head) {
  // 因为是有序的所以重复的元素是相邻的
  let p = head
  while(p && p.next) {
      if(p.val==p.next.val) {
          p.next = p.next.next
      }else{
          p = p.next
      }
  }
  return head
};
// leetcode 141 环形链表
// 解题思路  两个人在操场跑步 一快一慢 快的人必定会追上慢的人一圈  如果是环形链表 那么一定会相逢
var hasCycle = function(head) {
  let p1 = head 
  let p2 = head
  while(p1 && p2 && p2.next) {
    p1 = p1.next
    p2 = p2.next.next
    if(p1 == p2) {
      return true
    }
  }
  return false
}

// 